package logic;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import bean.Arma;
import bean.juego.Juego;
import bean.juego.JuegoFactory;
import bean.jugador.DatosJugadorFun;
import bean.jugador.Jugador;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.MyUtils;

public class Cargador {

    private static final Logger logger = Logger.getLogger(Cargador.class.getName());

    public static void cargarListaArmas() {
        Buscador.clearArmas();
        Arma arma;

        arma = new Arma("Rail Gun", Textos.descripcionRAILGUN);
        arma.getApodos().add(Arma.Armas_Ids.MOD_RAILGUN);
        Buscador.addArma(arma);

        arma = new Arma("Kamikaze", "");
        arma.getApodos().add(Arma.Armas_Ids.MOD_KAMIKAZE);
        Buscador.addArma(arma);

        arma = new Arma("Machine Gun", Textos.descripcionMACHINEGUN);
        arma.getApodos().add(Arma.Armas_Ids.MOD_MACHINEGUN);
        Buscador.addArma(arma);

        arma = new Arma("Rocket Launcher", Textos.descripcionROCKET);
        arma.getApodos().add(Arma.Armas_Ids.MOD_ROCKET);
        arma.getApodos().add(Arma.Armas_Ids.MOD_ROCKET_SPLASH);
        Buscador.addArma(arma);

        arma = new Arma("ChainGun", Textos.descripcionCHAINGUN);
        arma.getApodos().add(Arma.Armas_Ids.MOD_CHAINGUN);
        Buscador.addArma(arma);

        arma = new Arma("Gauntlet", Textos.descripcionGAUNTLET);
        arma.getApodos().add(Arma.Armas_Ids.MOD_GAUNTLET);
        Buscador.addArma(arma);

        arma = new Arma("Shotgun", Textos.descripcionSHOTGUN);
        arma.getApodos().add(Arma.Armas_Ids.MOD_SHOTGUN);
        Buscador.addArma(arma);

        arma = new Arma("Nail Gun", Textos.descripcionNAIL);
        arma.getApodos().add(Arma.Armas_Ids.MOD_NAIL);
        Buscador.addArma(arma);

        arma = new Arma("Lightning Gun", Textos.descripcionLIGHTNING);
        arma.getApodos().add(Arma.Armas_Ids.MOD_LIGHTNING);
        Buscador.addArma(arma);

        arma = new Arma("Plasma Gun", Textos.descripcionPLASMA);
        arma.getApodos().add(Arma.Armas_Ids.MOD_PLASMA_SPLASH);
        arma.getApodos().add(Arma.Armas_Ids.MOD_PLASMA);
        Buscador.addArma(arma);

        arma = new Arma("Grenade Launcher", Textos.descripcionGrenadeLauncher);
        arma.getApodos().add(Arma.Armas_Ids.MOD_GRENADE);
        arma.getApodos().add(Arma.Armas_Ids.MOD_GRENADE_SPLASH);
        Buscador.addArma(arma);

        arma = new Arma("Proximity Mine", Textos.descripcionProximityMine);
        arma.getApodos().add(Arma.Armas_Ids.MOD_PROXIMITY_MINE);
        Buscador.addArma(arma);
    }

    public static void cargarJugadores() {

        Jugador jugador;
        String nombre;
        DatosJugadorFun datosF;
        List<String> apodos;

        nombre = "Diego";
        datosF = new DatosJugadorFun(Textos.bioDiego, Textos.fraseDiego, "Area Denial", "");
        jugador = new Jugador(nombre, datosF);
        Buscador.addJugador(jugador);

        nombre = "German";
        datosF = new DatosJugadorFun(Textos.bioGerman, Textos.fraseGerman, "WebMaster", "Gentleman and Scholar");
        jugador = new Jugador(nombre, datosF);
        apodos = jugador.getDatos().getApodos();
        apodos.add("German Infantry");
        apodos.add("The Red Machine");
        apodos.add("The Machine");
        apodos.add("I dnt like this shit");
        apodos.add("No fear. German here");
        apodos.add("sudo bash root/root");
        apodos.add("No Mercy");
        apodos.add("Certified PHP Expert");
        apodos.add("Murmaider");
        apodos.add("Railgunning for fun");

        Collections.sort(apodos);
        Buscador.addJugador(jugador);

        nombre = "Cherta";
        datosF = new DatosJugadorFun(Textos.bioCherta, Textos.fraseCherta, "Base Defense", "Jaureguiberry summer turist");
        jugador = new Jugador(nombre, datosF);
        apodos = jugador.getDatos().getApodos();
        apodos.add("cherta");
        apodos.add("Obi Wan");
        apodos.add("Gorostiaga");
        apodos.add("Gorostiaga Pelado");
        Collections.sort(apodos);
        Buscador.addJugador(jugador);

        nombre = "Pixel";
        datosF = new DatosJugadorFun(Textos.bioPixel, Textos.frasePixel, "Precision Elimination", "CEO");
        jugador = new Jugador(nombre, datosF);
        apodos = jugador.getDatos().getApodos();
        apodos.add("Snipper reloaded");
        apodos.add("Cabo Narancio");
        Collections.sort(apodos);
        Buscador.addJugador(jugador);

        nombre = "JP";
        datosF = new DatosJugadorFun(Textos.bioJP, Textos.fraseJP, "Rapid Flag Recovery", "Salsa Practicioner");
        jugador = new Jugador(nombre, datosF);
        apodos = jugador.getDatos().getApodos();
        apodos.add("dolphin");
        apodos.add("Juan sin tierra");
        apodos.add("homeless");
        apodos.add("killed / got the RED");
        Collections.sort(apodos);
        Buscador.addJugador(jugador);

        nombre = "Dani";
        datosF = new DatosJugadorFun(Textos.bioDani, Textos.fraseDani, "Shock & Awe", "Quiet One");
        jugador = new Jugador(nombre, datosF);
        apodos = jugador.getDatos().getApodos();
        apodos.add("UnnamedPlayer");
        Collections.sort(apodos);
        Buscador.addJugador(jugador);

        nombre = "Nando";
        datosF = new DatosJugadorFun(Textos.bioNando, Textos.fraseNando, "Base Cleaning", "Darkwing");
        jugador = new Jugador(nombre, datosF);
        apodos = jugador.getDatos().getApodos();
        apodos.add("EL DOLOR ES PASAJERO");
        apodos.add("RAY CHARLES");
        apodos.add("MENDOZAAAAAA");
        apodos.add("BERNARDO");
        apodos.add("NANDO");
        apodos.add("MMBRGRBRMBGR");
        apodos.add("A LA BALSA!!!");
        apodos.add("ESTOESUNAPORONG");
        apodos.add("EL PATO BOMBARDIER");
        apodos.add("CORAZON DE PATO");
        apodos.add("PATO VICIOSO");
        apodos.add("PATO ATRAGANTADO");
        apodos.add("PATO CABRERO");
        apodos.add("PATO VERANIEGO");
        apodos.add("PATO SANGUINARIO");

        Collections.sort(apodos);
        Buscador.addJugador(jugador);

        nombre = "Tincho";
        datosF = new DatosJugadorFun(Textos.bioTincho, Textos.fraseTincho, "Assisted Homicide", "Bad Mood Clown");
        jugador = new Jugador(nombre, datosF);
        apodos = jugador.getDatos().getApodos();
        apodos.add("VOLVIO UN DIA");
        apodos.add("EL TENEDOR MAGICO");
        apodos.add("EL VASCO");
        apodos.add("RONDON");
        apodos.add("PITUFINA Y RONALDO");
        apodos.add("LA PITUFINA IS BACK");
        apodos.add("EL CAMPERA");
        apodos.add("BOMBERO SIN BOINA");
        apodos.add("CABEZA SALAZAR");
        apodos.add("YO NO HAGO DIETA");
        apodos.add("TEODORO");
        apodos.add("PARO AEREO NOMAS!!");
        apodos.add("EL FLAUTA BARREIRO");
        apodos.add("PITUFINA IS BACK");
        apodos.add("SIMBAD EL MARINO SOY");
        apodos.add("SIMBAD EL MARINO");
        apodos.add("CROHN");
        apodos.add("CROHN IS BACK");
        apodos.add("CRHIS DEDUM");
        apodos.add("EXTRANIO A PITUFINA");
        apodos.add("EL BODEGUITA");
        apodos.add("VASECTOMY GUY");
        Collections.sort(apodos);
        Buscador.addJugador(jugador);

        nombre = "Rodrigo";
        datosF = new DatosJugadorFun(Textos.bioRodrigo, Textos.fraseRodrigo, "Promising Beginner", "Fata Fanboy");
        jugador = new Jugador(nombre, datosF);
        apodos = jugador.getDatos().getApodos();
        apodos.add("rocko");
        apodos.add("Rockosaurio");
        apodos.add("Tetano");
        Collections.sort(apodos);
        Buscador.addJugador(jugador);

        nombre = "Gustav";
        datosF = new DatosJugadorFun(Textos.bioGustav, Textos.fraseGustav, "Infiltration and Assassination", "");
        jugador = new Jugador(nombre, datosF);
        apodos = jugador.getDatos().getApodos();
        apodos.add("At MAdrid Campeon");
        apodos.add("General McArthur");
        apodos.add("La Anchoa de Medero");
        apodos.add("Matrero");
        apodos.add("Insecticide");
        apodos.add("Bauxite Rules!");
        apodos.add("si jp mina le doy");
        apodos.add("Franklin Tseng");
        apodos.add("Somo Subro");
        Collections.sort(apodos);
        Buscador.addJugador(jugador);

        nombre = "Bot";
        datosF = new DatosJugadorFun(Textos.bioBot, Textos.fraseBot, "Emergency Replacement", "Botnator");
        jugador = new Jugador(nombre, datosF);
        apodos = jugador.getDatos().getApodos();
        apodos.add("Arachna");
        apodos.add("Andriy");
        apodos.add("Gargoyle");
        apodos.add("Assassin");
        apodos.add("Ayumi");
        apodos.add("Angelyss");
        apodos.add("Beret");
        apodos.add("Sergei");
        apodos.add("Broadklin");
        apodos.add("Cyber-Garg");
        apodos.add("Metalbot");
        apodos.add("S_Marine");
        apodos.add("Sorceress");
        apodos.add("Dark");
        apodos.add("Liz");
        apodos.add("Kyonshi");
        apodos.add("Jenna");
        apodos.add("Grunt");
        apodos.add("Skelebot");
        apodos.add("Grism");
        apodos.add("Headcrash");
        Collections.sort(apodos);
        Buscador.addJugador(jugador);

        nombre = "Fede";
        datosF = new DatosJugadorFun(Textos.bioFede, Textos.fraseFede, "Research & Development", "Pyxis Doombringer");
        jugador = new Jugador(nombre, datosF);
        apodos = jugador.getDatos().getApodos();
        apodos.add("V Neck");
        Collections.sort(apodos);
        Buscador.addJugador(jugador);
    }

    private static Juego cargarJuego(String lineaInicial, String tiempoInicio, BufferedReader leer) throws IOException {

        Juego juego = JuegoFactory.getInstancia().getJuego(lineaInicial);

        if (Buscador.getJuego(juego.getFechaJuego()) != null) {
            return juego;
        }

        juego.setInicio(tiempoInicio);
        boolean fin = false;

        while (!fin) {
            fin = juego.procesarLinea(leer);
        }

        return juego;
    }

    public static void cargarJuegos(String logLocation) throws IOException {
        File dir = new File(logLocation);

        if (dir.isDirectory()) {

            File[] files = dir.listFiles();

            for (File file : files) {
                if (file.isFile()) {
                    processLog(file);
                }
            }


        } else {
            logger.log(Level.SEVERE, "{0} is not a directory", logLocation);
        }
    }

    public static void processLog(String logLocation) throws IOException {
        processLog(new File(logLocation));
    }

    public static void processLog(File logFile) throws IOException {

        BufferedReader leer = new BufferedReader(new InputStreamReader(new FileInputStream(logFile)));
        String linea;
        Matcher m;
        try {
            while ((linea = leer.readLine()) != null) {
                m = Juego.patternInitGame.matcher(linea);
                if (m.matches()) {
                    Juego juego = cargarJuego(linea, m.group(1), leer);
                    if (Buscador.getJuego(juego.getFechaJuego()) == null) {
                        juego.cargarEnSistema();
                    }
                }
            }
        } finally {
            MyUtils.silentClose(leer);
        }
    }
}
